<?php
/**
 * 得到最上级用户id
 * @param $id 需要查询的用户id
 * @return mixed
 * @author 杨希成
 */
function mogo_get_pid($id)
{
    $user = $this->get_find(['id' => $id]);
    if ($user->group_id == 2) return $user->id;
    $user_all = collection($this->get_select())->toArray();
    $pids = get_parent_id($user_all, $user->pid);
    foreach ($pids as $v) {
        if ($v['group_id'] == 2) {
            return $v['id'];
        }
    }
}
/**
 * 查询所有下级
 * @param $array      需要筛选的数组
 * @param $parent_id  要查询的id
 * @return array
 * @author 杨希成
 */
function mogo_get_children_id($array, $parent_id)
{
    $arr = array();
    foreach ($array as $v) {
        if ($v['pid'] == $parent_id) {
            $arr[] = $v;
            $arr = array_merge($arr, get_children_id($array, $v['id']));
        }
    }
    return $arr;
}
/**
 * 得到随机小数使用案例
 * @param $mix_num
 * @param $max_num
 * @return float|int
 * @author 杨希成
 */

function mogo_get_rand($mix_num,$max_num){
    $FloatLength = getFloatLength($mix_num);
    $jishu_rand = pow(10, $FloatLength);
    $shop_min = $mix_num * $jishu_rand;
    $shop_max = $max_num * $jishu_rand;
    $rand = rand($shop_min, $shop_max) / $jishu_rand;
    return $rand;
}
/**
 * //计算小数点后位数
 * @param $num
 * @return int
 * @author 杨希成
 */
function mogo_getFloatLength($num) {
    $count = 0;
    $temp = explode ( '.', $num );
    if (sizeof ( $temp ) > 1) {
        $decimal = end ( $temp );
        $count = strlen ( $decimal );
    }
    return $count;
}
/**
 * @param $num 科学计数法字符串  如 2.1E-5
 * @param int $double 小数点保留位数 默认5位
 * @return string
 * @author 杨希成
 */
function mogo_sctonum($num, $double = 5)
{
    if (false !== stripos($num, "e")) {
        $a = explode("e", strtolower($num));
        return bcmul($a[0], bcpow(10, $a[1], $double), $double);
    }
    return $num;
}
/**
 * 数字格式化
 * @author 杨希成
 */
function mogo_num_format($num){
    if(!is_numeric($num)){
        return false;
    }
    $num = explode('.',$num);//把整数和小数分开
    $rl = $num[1];//小数部分的值
    $j = strlen($num[0]) % 3;//整数有多少位
    $sl = substr($num[0], 0, $j);//前面不满三位的数取出来
    $sr = substr($num[0], $j);//后面的满三位的数取出来
    $i = 0;
    $rvalue = '';
    while($i <= strlen($sr)){
        $rvalue = @$rvalue.','.substr($sr, $i, 3);//三位三位取出再合并，按逗号隔开
        $i = $i + 3;
    }
    $rvalue = $sl.$rvalue;
    $rvalue = substr($rvalue,0,strlen($rvalue)-1);//去掉最后一个逗号
    $rvalue = explode(',',$rvalue);//分解成数组
    if($rvalue[0]==0){
        array_shift($rvalue);//如果第一个元素为0，删除第一个元素
    }
    $rv = $rvalue[0];//前面不满三位的数
    for($i = 1; $i < count($rvalue); $i++){
        $rv = $rv.','.$rvalue[$i];
    }
    if(!empty($rl)){
        $rvalue = $rv.'.'.$rl;//小数不为空，整数和小数合并
    }else{
        $rvalue = $rv;//小数为空，只有整数
    }
    return $rvalue;
}
/**
 * 限制字符长度，用...代替
 * @param $sourcestr string
 * @param $cutlength string
 * @return string
 * @author 杨希成
 */
function mogo_cut_str($sourcestr,$cutlength)
{
    $returnstr='';
    $i=0;
    $n=0;
    $str_length=strlen($sourcestr);//字符串的字节数
    while (($n<$cutlength) and ($i<=$str_length))
    {
        $temp_str=substr($sourcestr,$i,1);
        $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
        if ($ascnum>=224)    //如果ASCII位高与224，
        {
            $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符
            $i=$i+3;            //实际Byte计为3
            $n++;            //字串长度计1
        }
        elseif ($ascnum>=192) //如果ASCII位高与192，
        {
            $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
            $i=$i+2;            //实际Byte计为2
            $n++;            //字串长度计1
        }
        elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，
        {
            $returnstr=$returnstr.substr($sourcestr,$i,1);
            $i=$i+1;            //实际的Byte数仍计1个
            $n++;            //但考虑整体美观，大写字母计成一个高位字符
        }
        else                //其他情况下，包括小写字母和半角标点符号，
        {
            $returnstr=$returnstr.substr($sourcestr,$i,1);
            $i=$i+1;            //实际的Byte数计1个
            $n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...
        }
    }
    if ($str_length>$i){
        $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
    }
    return $returnstr;
}
/**
 * 得到发布时间差
 * @param $time
 * @return string
 * @author 杨希成
 */
function mogo_get_time($time){
    $now=date('Y-m-d H:i:s');
    $date=floor((strtotime($now)-strtotime($time))/86400);                  //天
    $hour=floor((strtotime($now)-strtotime($time))%86400/3600);             //时
    $minute=floor((strtotime($now)-strtotime($time))%86400/60);             //分
    $second=floor((strtotime($now)-strtotime($time))%86400%60);             //秒
    if($date){
        return $date.'天前';
    }else if($hour){
        return $hour.'小时前';
    }else if($minute){
        return $minute.'分钟前';
    }else{
        return '刚刚';
    }
}

/**
 * 统一错误码
 * @param string $msg
 * @param array $extra
 * @return \think\response\Json
 */
function mogo_error($msg='no message',$extra =[]){
    return json(['error'=>$msg,'extra'=>$extra],400);
}

/**
 * 统一返回数据代码
 */
function mogo_json($list=[],$msg='no msg',$extra=[]){
    return json(['list'=>$list,'msg'=>$msg,'extra'=>$extra]);
}

/**
 *发送http请求
 * @param string $url
 */
if(!function_exists('get_curl')){
    function get_curl($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
}

/**
 * 修改图片所有编辑器内容中图片路径
 * @param string $content
 */
function get_path_img($content){
    /*    $pattern="/<img.*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";*/
    $pattern="/\/public(.*?(?:[\.gif|\.jpg]))[\\' | \"]/";
    $path='http://'.$_SERVER['SERVER_NAME'];
    if (empty($content)) return $content;
    preg_match_all($pattern, $content, $match);
//    dump($match[0]);die;
    if (empty($match[0])) {
        return $content;
    }
    $path='https://'.$_SERVER['SERVER_NAME'];
    $str=preg_replace_callback($pattern,
        function($matchs) use ($path) {
            return $path.$matchs[0];
        },$content);
    return $str;
}

/**
 * 字符串截取，支持中文和其他编码
 * static
 * access public
 * @param string $str 需要转换的字符串
 * @param string $length 截取长度
 * @param string $start 开始位置
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * return string
 */
function msubstr($str,$length, $start=0, $charset="utf-8", $suffix=true) {
    if(function_exists("mb_substr")){
        $slice = mb_substr($str, $start, $length, $charset);
        $strlen = mb_strlen($str,$charset);
    }elseif(function_exists('iconv_substr')){
        $slice = iconv_substr($str,$start,$length,$charset);
        $strlen = iconv_strlen($str,$charset);
    }else{
        $re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("",array_slice($match[0], $start, $length));
        $strlen = count($match[0]);
    }
    if($suffix && $strlen>$length)$slice.='...';
    return $slice;
}

/**
 * 获得单图及多图路径
 * @param string $id    图片id字符串
 * @return array|string 图片路径
 */
    function get_images_all($id='')
    {
        $res=strpos($id,",");
        if($res!==false){
            $id=explode(",",$id);
            $id=get_files_path($id);
            foreach ($id as &$v){
                $v='https://'.$_SERVER['SERVER_NAME'].$v;
            }
        }else{
            $id='https://'.$_SERVER['SERVER_NAME'].get_file_path($id);
        }
        return $id;
    }

/**
* 经典的概率算法，
* $proArr是一个预先设置的数组，
* 假设数组为：array(100,200,300，400)，
* 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内，
* 如果不在，则将概率空间，也就是k的值减去刚刚的那个数字的概率空间，
* 在本例当中就是减去100，也就是说第二个数是在1，900这个范围内筛选的。
* 这样 筛选到最终，总会有一个数满足要求。
* 就相当于去一个箱子里摸东西，
* 第一个不是，第二个不是，第三个还不是，那最后一个一定是。
* 这个算法简单，而且效率非常高，
* 这个算法在大数据量的项目中效率非常棒。
*/
function get_rand($proArr) {
    $result = '';
    //概率数组的总概率精度
    $proSum = array_sum($proArr);
    //概率数组循环
    foreach ($proArr as $key => $proCur) {
        $randNum = mt_rand(1, $proSum);
        if ($randNum <= $proCur) {
            $result = $key;
            break;
        } else {
            $proSum -= $proCur;
        }
    }
    unset ($proArr);
    return $result;
}

/**
 * @param $url 二维码链接url
 * @param $logourl 二维码logo图标url
 */
function create_qr_code($url,$logourl)
{
    if(empty($url)) return false;
    if(empty($logourl)) return false;
    $url=urlencode($url);
    $qr = "http://qr.liantu.com/api.php?text=$url&logo=$logourl";
    echo "<img src='{$qr}'>";
}

/**
 * 根据两个地点的经度和纬度计算距离
 * 半正矢公式(Haversine)根据经纬度计算两点间距离
 * @param latitude纬度  longitude经度
 */
function distance($lat1, $lon1, $lat2, $lon2) {
    $R = 6371393; //地球平均半径,单位米
    $dlat = deg2rad($lat2-$lat1);
    $dlon = deg2rad($lon2-$lon1);
    $a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2);
    $c = 2 * atan2(sqrt($a), sqrt(1-$a));
    $d = $R * $c;
    return round($d);
}

/**
 * 中国正常GCJ02坐标---->百度地图BD09坐标
 * 腾讯地图用的也是GCJ02坐标
 * @param double $lat 纬度
 * @param double $lng 经度
 */
function Convert_GCJ02_To_BD09($lat,$lng){
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $lng;
    $y = $lat;
    $z =sqrt($x * $x + $y * $y) + 0.00002 * sin($y * $x_pi);
    $theta = atan2($y, $x) + 0.000003 * cos($x * $x_pi);
    $lng = $z * cos($theta) + 0.0065;
    $lat = $z * sin($theta) + 0.006;
    return array('lng'=>$lng,'lat'=>$lat);
}

/**
 * 百度地图BD09坐标---->中国正常GCJ02坐标（包含腾讯地图）
 * 腾讯地图用的也是GCJ02坐标
 * @param double $lat 纬度
 * @param double $lng 经度
 * @return array();
 */
function Convert_BD09_To_GCJ02($lat,$lng){
    $x_pi = 3.14159265358979324 * 3000.0 / 180.0;
    $x = $lng - 0.0065;
    $y = $lat - 0.006;
    $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi);
    $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi);
    $lng = $z * cos($theta);
    $lat = $z * sin($theta);
    return array('lng'=>$lng,'lat'=>$lat);
}

/**
 * @param string $address 地址
 * @param string $type  地图数据类型百度坐标、腾讯坐标
 * @return array
 */
function getLatLng($address='',$type='baidu')
{
    if(empty($address)) return $arr=['地址为空'];
    //根据地址获取经纬度
    $address = urlencode($address);
    if($type=='baidu'){
        $url = "http://api.map.baidu.com/geocoder/v2/?address=".$address
            ."&output=json&ak=uR9ZuZM1ON2kFWuMZMZcbSlyl7BWVj2n";
    }elseif ($type=='tengxun'){
        $url = "https://apis.map.qq.com/ws/geocoder/v1/?address=".$address
            ."&output=json&key=2KTBZ-CZ2CP-4PED6-VL5BO-NMJ4J-M2FGO";
    }
    $address_data = file_get_contents($url);
    $json_data = json_decode($address_data);
    // halt($json_data);
         $lng = $json_data->result->location->lng;
         $lat = $json_data->result->location->lat;
         $arr['lng']=$lng;
         $arr['lat']=$lat;
         return $arr;
}


/**
 * 写日志，方便测试（看网站需求，也可以改成把记录存入数据库）
 * 注意：服务器需要开通fopen配置
 * @param $word 要写入日志里的文本内容 默认值：空值
 */
function logResult($word='',$log_file="log.txt") {
    date_default_timezone_set("PRC");
    $fp = fopen($log_file,"a");
    flock($fp, LOCK_EX) ;
    fwrite($fp,"执行日期：".strftime("%Y-%m-%d %H:%M:%S",time())."\n".$word."\n\n");
    flock($fp, LOCK_UN);
    fclose($fp);
}

/**
 * 生成随机字符串
 * @return string
 */
function getOrderNum($str='yd') {
    return $str.date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}


/**
 * 生成图片
 * @Author   LinPengFei
 * @DateTime 2018-04-18T18:03:21+0800
 * @param    string        $title    [标题]
 * @param    string        $summary  [简介]
 * @param    string        $codeUrl  [二维码地址]
 * @param    string        $imageUrl [底部图片地址]
 * @param    integer       $width    [图片宽度]
 * @param    string        $ttf      [字体文件]
 * @return   [type]                  [description]
 */
function image($fname='',$title='',$summary='',$codeUrl='',$imageUrl='',$width = 1080,$ttf = './Yahei.ttf')
{
    $height       = $width*1.6;//高
    $padd           = $width/25;//边距
    $title_size   = $width/17;//标题大小
    $summary_size = $width/25;//简介大小
    $line         = $width/25;//行间距
    $code_width   = $width/3; //二维码宽度
    $image_width  = $width-2*$padd;//底部图片宽度
    $canvas       = imageCreatetruecolor($width, $height);//新建画布
    $color        = imagecolorallocate($canvas, 255, 255, 255);//背景白色
    imagefill($canvas, 0, 0, $color);
    $black     = imagecolorallocate($canvas,0,0,0);//标题黑色画笔
    $gray      = imagecolorallocate($canvas,192,192,192);//时间灰色画笔
    $dark_gray = imagecolorallocate($canvas,88,87,86);//简介深灰色画笔
    //标题两行
    $title_len  = mb_strlen($title,'utf-8');//标题长度
    $title_line = floor((($width-2*$padd)/$title_size));//每行字数
    if ($title_len <= $title_line) {
        $line_one    = $title;
        $line_second = '';
    }
    if ($title_len > $title_line && $title_len <= 2*$title_line) {
        $line_one    = mb_substr($title,0,$title_line);
        $line_second = mb_substr($title,$title_line);
    }
    if ($title_len > 2*$title_line) {
        $line_one    = mb_substr($title,0,$title_line);
        $line_second = mb_substr($title,$title_line,$title_line-2).'...';
    }
    imagettftext($canvas,$title_size/1.33,0,$padd,$padd+$title_size,$black,$ttf,$line_one ); //第一行
    imagettftext($canvas,$title_size/1.33,0,$padd,$padd+2*$title_size+$line,$black,$ttf,$line_second ); //第二行
    //时间
    imagettftext ( $canvas , $summary_size/1.33, 0 , $padd , $padd+2*$title_size+2*$line+$summary_size, $gray , $ttf , date('Y-m-d H:i:s'));
    //简介三行 默认大于三行
    $summary_line = floor((($width-2*$padd)/$summary_size));//每行字数
    $line_one     = mb_substr($summary,0,$summary_line);
    $line_second  = mb_substr($summary,$summary_line,$summary_line);
    $line_third   = mb_substr($summary,2*$summary_line,$summary_line-2).'...';
    imagettftext ( $canvas , $summary_size/1.33, 0, $padd , $padd+2*$title_size+3*$line+2*$summary_size , $dark_gray , $ttf , $line_one ); //第一行
    imagettftext ( $canvas , $summary_size/1.33, 0, $padd , $padd+2*$title_size+4*$line+3*$summary_size, $dark_gray , $ttf , $line_second ); //第二行
    imagettftext ( $canvas , $summary_size/1.33, 0, $padd , $padd+2*$title_size+5*$line+4*$summary_size, $dark_gray , $ttf , $line_third ); //第三行
    //二维码
    imagettftext ( $canvas , $title_size/1.33, 0, $padd , $padd+5*$title_size+6*$line+4*$summary_size, $black , $ttf , '长按扫码识别');
//    halt($codeUrl);
    $cul=explode('.', $codeUrl);
    $suffix = end($cul);
    if ($suffix == 'jpg' || $suffix == 'jpeg') $code = imagecreatefromjpeg($codeUrl);
    if ($suffix == 'png') $code = imagecreatefrompng($codeUrl);
    if ($suffix == 'gif') $code = imagecreatefromgif($codeUrl);
    if ($suffix == 'bmp') $code = imagecreatefrombmp($codeUrl);
    $code_oldW = imagesx($code);
    $code_oldH = imagesy($code);
    $percent1  = $code_oldH/$code_oldW;//长宽比例
    imagecopyresampled( $canvas , $code , $width-$padd-$code_width , $padd+2*$title_size+6*$line+4*$summary_size , 0 , 0 , $code_width , $code_width*$percent1 , $code_oldW , $code_oldH);
    //底部图片
    $iul=explode('.', $imageUrl);
    $suffix = end($iul);
    if ($suffix == 'jpg' || $suffix == 'jpeg') $image = imagecreatefromjpeg($imageUrl);
    if ($suffix == 'png') $image = imagecreatefrompng($imageUrl);
    if ($suffix == 'gif') $image = imagecreatefromgif($imageUrl);
    if ($suffix == 'bmp') $image = imagecreatefrombmp($imageUrl);
    $image_oldW = imagesx($image);
    $image_oldH = imagesy($image);
    //长宽比例
    $percent2 = $image_oldH/$image_oldW;
    imagecopyresampled( $canvas , $image , $padd , $padd+2*$title_size+7*$line+4*$summary_size+$code_width*$percent1 , 0 , 0 , $image_width , $image_width*$percent2 , $image_oldW , $image_oldH);
    //输出到浏览器
//    header("content-type:image/png");
//    imagejpeg($canvas);

    //保存图片,销毁图形，释放内存
//    $filename = mb_substr($title,0,5).'.jpg';
    $filename =$fname.'.jpg';
    if (!file_exists($filename)) {
        imagejpeg($canvas, $filename);
        imagedestroy($canvas);
    } else {
        imagedestroy($canvas);
    }


}

/**
 * POST请求https接口返回内容
 * @param  string $url [请求的URL地址]
 * @param  string $data [请求的参数]
 * @return  string
 */
function post_curl($url, $data){
    $ch = curl_init();
    $header = "Accept-Charset: utf-8";
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    //     var_dump($tmpInfo);
    //    exit;
    if (curl_errno($ch)) {
        return false;
    }else{
        // var_dump($tmpInfo);
        return $tmpInfo;
    }
}